/*
 * ThreadPoolFactory.java 作者：雷清英 2016-5-13 创建文件
 */
package com.xiaoma.aes.util;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * 
 **************************************************
 * 线程池工厂类
 * @version 0.0.1
 * @author qylei 2016-5-24
 *************************************************
 */
public class ThreadPoolFactory{
    
    private static int corePoolSize = 100;
    private static int maximumPoolSize = 150;
    private static long keepAliveTime = 60L;
    private static ThreadPoolExecutor threadPoolFactory;
    
    private ThreadPoolFactory(){}
    
    /**
     * 创建线程池
     * @return ThreadPoolExecutor ThreadPoolExecutor
     * @author qylei
     * @since 0.0.1
     * @date 2016年9月27日 上午10:52:40
     */
    private static ThreadPoolExecutor getPool(){
        if(threadPoolFactory == null){
            setThreadPoolFactory(new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(100), new ThreadPoolExecutor.DiscardOldestPolicy()));
        }
        return threadPoolFactory;
    }
    
    /**
     * 获取线程池
     * @return ThreadPoolExecutor ThreadPoolExecutor
     * @author qylei
     * @since 0.0.1
     * @date 2016年9月27日 上午10:52:40
     */
    public static ThreadPoolExecutor getThreadPoolFactory(){
        return threadPoolFactory;
    }
    
    /**
     * 设置线程池
     * @param threadPoolFactory threadPoolFactory
     * @author qylei
     * @since 0.0.1
     * @date 2016年9月27日 上午10:52:40
     */
    public static void setThreadPoolFactory(ThreadPoolExecutor threadPoolFactory){
        ThreadPoolFactory.threadPoolFactory = threadPoolFactory;
    }
    
    /**
     * Runnable run
     * @param run run
     * @author qylei
     * @since 0.0.1
     * @date 2016年9月27日 上午10:52:40
     */
    public static void execute(Runnable run){
        getPool().execute(run);
    }
    
    /**
     * Thread run
     * @param run run
     * @author qylei
     * @since 0.0.1
     * @date 2016年9月27日 上午10:52:40
     */
    public static void execute(Thread run){
        getPool().execute(run);
    }
    
    /**
     * 
     * @author maj
     * @param task
     * @return
     * @version 0.0.1
     * @param <V>
     * @since 0.0.1
     * @data 2019年7月16日 下午3:55:55
     */
    public static <T> Future<T> submit(Callable<T> task){
        return getPool().submit(task);
    }
}
